<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/*! 
 * @page ToolsPage Исходный код класса Tools
 * @include tools.class.php
 */

/*! @addtogroup ClassWebFormsQA Основные классы проекта
 *  Группа включает основные классы используемые в проекте WebFormsQA
 *  @{
 */


/**
 * @class Tools
 * @brief Инструментальных класс предназначен для хранения общих методов,
 *           логически слабо связанных между собой \n
 * @ref ToolsPage          
 *
 * примечание: при появлениии нескольких методов, которые логически
 *             могут относится к одной группе, они будут вынесены в отдельный
 *             класс.
 */
class Tools {


    /**
     * @brief Функция возвращает время в секундах и милисекундах
     */
    function getmicrotime()
    {
        list($usec, $sec) = explode(" ", microtime());
        return ((float)$usec + (float)$sec);
    }

    /**
     * @brief Функция рекурсивно удаляет все файлы заданного каталога, подкаталоги
     *        и сам каталог
     * @param string $full_name     - имя каталога с полным путем
     */
    function delDir($full_name)
    {
        $flag_result = false;

        if (is_dir($full_name)) {
            $dh  = opendir($full_name);

            while (false !== ($filename = readdir($dh))) {
                $name = $full_name."/$filename";
                // специальные каталоги пропускаем
                $pos = strrpos($name, ".");
                $len = strlen($name);

                // точка в конце - признак специальных файлов /. /..
                // которые мы не рассматриваем
                $flag_find = ($pos === $len-1 || $pos === $len-2);
                if ($flag_find === false) {
                    // рекурсивно удаляем все подкаталоги с файлами
                    if (is_dir($name)) {
                        Tools::delDir($name);
                    } else {
                        unlink($name);
                    }
                }
            }

            closedir($dh);

            rmdir($full_name);
            $flag_result = true;
        }

        return $flag_result;
    } // delDir

    /**
     * @brief Функция сохраняет хеш входной строки в файл c заданным именем
     *
     * @param string $in_str        - входная строка
     * @param string $name_file     - имя файла результата
     * @param string $algorithm     - название алгоритма хеширования
     *                                поддерживаются md5, sha1, crc32, по умолчанию md5
     * @return mixture              - в случае успеха - хеш строка иначе false
     */
    function saveHash($in_str, $name_file, $algorithm='md5')
    {
        $result = false;
        if ($f_res = fopen($name_file, "a+")) {

            $hash = false;
            switch ($algorithm) {
                case 'md5':
                    $hash = md5($in_str);
                    break;
                case 'sha1':
                    $hash = sha1($in_str);
                    break;
                case 'crc32':
                    $hash = crc32($in_str);
                    break;
            }

            if ($hash) {
                $result = $hash;
                fwrite($f_res, "$in_str = $hash \r\n");
            }

            fclose($f_res);
        }

        return $result;

    } // saveHash

    /**
     * @brief Метод изменяет конец строки файлов в заданном каталоге и его подкоталогах
     *        Windows конец строки CRLF (0x0d 0x0a) меняется на LF (Linux)
     *
     * @param string $dir           - имя каталога
     * @param string $expand        - расширение файлов
     * @return bool                 - успех операции
     *
     * пример использовани
     *      require_once("tools.class.php");
     *      Tools::win2lin("./", ".php");
     *
     */
    function win2lin($dir = "./", $expand = "all") {
        return Tools::findAndReplaceEndFiles($dir, $expand, "\r\n", "\n");
    }

    /**
     * @brief Метод изменяет конец строки файлов в заданном каталоге и его подкоталогах
     *        Linux конец строки LF меняется на CRLF (0x0d 0x0a) (Windows) 
     *
     * @param string $dir           - имя каталога
     * @param string $expand        - расширение файлов
     * @return bool                 - успех операции
     */
    function lin2win($dir = "./", $expand = "all") {
        return Tools::findAndReplaceEndFiles($dir, $expand, "\n", "\r\n");
    }


    /**
     *  @brief Функция рекурсивно заменяет одни строки на другие в файлах заданного каталога и подкаталогов
     *
     * @param string $full_name     - имя каталога с полным путем
     * @param string $expand        - расширение файлов
     * @param string $in            - входная строка для замены
     * @param string $out           - выходная строка
     * @return bool                 - успех операции
     */
    function findAndReplaceEndFiles($full_name, $expand, $in, $out)
    {
        $flag_result = false;

        if (is_dir($full_name)) {
            $dh  = opendir($full_name);
            while (false !== ($filename = readdir($dh))) {
                $name = $full_name."/$filename";
                // специальные каталоги пропускаем
                if (strpos($name, "/.") === false) {

                    // рекурсивно удаляем все подкаталоги с файлами
                    if (is_dir($name)) {
                        Tools::findAndReplaceEndFiles($name, $expand, $in, $out);
                    } else {
                        // изменяем только файлы с заданным разрешением
                        if (strpos($name, "all") !== false  || strpos($name, $expand) !== false ) {
                            $contents = file_get_contents($name);
                            $str = str_replace($in, $out, $contents);

                            $f_res = fopen($name, "w");
                            fwrite($f_res, "$str");
                            fclose($f_res);

                            echo "file change $name <br>";
                        }
                    }
                }
            }

            closedir($dh);
            $flag_result = true;
        }

        return $flag_result;
    } // delDir


} // Tools

/*! @} */

?>
